using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._SpatialAnalystTools._Surface
{
    /// <summary>
    /// <para>Aspect</para>
    /// <para>Derives the aspect from each cell of a raster surface.</para>
    /// <para>从栅格表面的每个像元派生坡向。</para>
    /// </summary>    
    [DisplayName("Aspect")]
    public class Aspect : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Aspect()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_raster">
        /// <para>Input raster</para>
        /// <para>The input surface raster.</para>
        /// <para>输入表面栅格。</para>
        /// </param>
        /// <param name="_out_raster">
        /// <para>Output raster</para>
        /// <para><xdoc>
        ///   <para>The output aspect raster.</para>
        ///   <para>It will be floating-point type.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出方面栅格。</para>
        ///   <para>它将是浮点型的。</para>
        /// </xdoc></para>
        /// </param>
        public Aspect(object _in_raster, object _out_raster)
        {
            this._in_raster = _in_raster;
            this._out_raster = _out_raster;
        }
        public override string ToolboxName => "Spatial Analyst Tools";

        public override string ToolName => "Aspect";

        public override string CallName => "sa.Aspect";

        public override List<string> AcceptEnvironments => ["autoCommit", "cellSize", "cellSizeProjectionMethod", "configKeyword", "extent", "geographicTransformations", "mask", "outputCoordinateSystem", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_in_raster, _out_raster, _method.GetGPValue(), _z_unit.GetGPValue(), _project_geodesic_azimuths.GetGPValue()];

        /// <summary>
        /// <para>Input raster</para>
        /// <para>The input surface raster.</para>
        /// <para>输入表面栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_raster { get; set; }


        /// <summary>
        /// <para>Output raster</para>
        /// <para><xdoc>
        ///   <para>The output aspect raster.</para>
        ///   <para>It will be floating-point type.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出方面栅格。</para>
        ///   <para>它将是浮点型的。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_raster { get; set; }


        /// <summary>
        /// <para>Method</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the calculation will be based on a planar (flat earth) or a geodesic (ellipsoid) method.</para>
        ///   <bulletList>
        ///     <bullet_item>Planar—The calculation will be performed on a projected flat plane using a 2D Cartesian coordinate system. This is the default method.</bullet_item><para/>
        ///     <bullet_item>Geodesic—The calculation will be performed in a 3D Cartesian coordinate system by considering the shape of the earth as an ellipsoid.</bullet_item><para/>
        ///   </bulletList>
        ///   <para>The planar method is appropriate to use on local areas in a projection that maintains correct distance and area. It is suitable for analyses that cover areas such cities, counties, or smaller states in area. The geodesic method produces a more accurate result, at the potential cost of an increase in processing time.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定计算是基于平面（平坦地球）还是测地线（椭球体）方法。</para>
        ///   <bulletList>
        ///     <bullet_item>平面 - 将使用 2D 笛卡尔坐标系在投影平面上执行计算。这是默认方法。</bullet_item><para/>
        ///     <bullet_item>测地线 - 通过将地球的形状视为椭球体，将在 3D 笛卡尔坐标系中执行计算。</bullet_item><para/>
        ///   </bulletList>
        ///   <para>平面方法适用于在保持正确距离和面积的投影中的局部区域上使用。它适用于覆盖城市、县或较小州等区域的分析。测地线方法产生更准确的结果，但可能会增加处理时间。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Method")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _method_value _method { get; set; } = _method_value._PLANAR;

        public enum _method_value
        {
            /// <summary>
            /// <para>Planar</para>
            /// <para>Planar—The calculation will be performed on a projected flat plane using a 2D Cartesian coordinate system. This is the default method.</para>
            /// <para>平面 - 将使用 2D 笛卡尔坐标系在投影平面上执行计算。这是默认方法。</para>
            /// </summary>
            [Description("Planar")]
            [GPEnumValue("PLANAR")]
            _PLANAR,

            /// <summary>
            /// <para>Geodesic</para>
            /// <para>Geodesic—The calculation will be performed in a 3D Cartesian coordinate system by considering the shape of the earth as an ellipsoid.</para>
            /// <para>测地线 - 通过将地球的形状视为椭球体，将在 3D 笛卡尔坐标系中执行计算。</para>
            /// </summary>
            [Description("Geodesic")]
            [GPEnumValue("GEODESIC")]
            _GEODESIC,

        }

        /// <summary>
        /// <para>Z unit</para>
        /// <para><xdoc>
        ///   <para>The linear unit of vertical z-values.</para>
        ///   <para>It is defined by a vertical coordinate system if it exists. If a vertical coordinate system does not exist, the z-unit should be defined from the unit list to ensure correct geodesic computation. The default is meter.</para>
        ///   <bulletList>
        ///     <bullet_item>Inch—The linear unit will be inches.</bullet_item><para/>
        ///     <bullet_item>Foot—The linear unit will be feet.</bullet_item><para/>
        ///     <bullet_item>Yard—The linear unit will be yards.</bullet_item><para/>
        ///     <bullet_item>Mile US—The linear unit will be miles.</bullet_item><para/>
        ///     <bullet_item>Nautical mile—The linear unit will be nautical miles.</bullet_item><para/>
        ///     <bullet_item>Millimeter—The linear unit will be millimeters.</bullet_item><para/>
        ///     <bullet_item>Centimeter—The linear unit will be centimeters.</bullet_item><para/>
        ///     <bullet_item>Meter—The linear unit will be meters.</bullet_item><para/>
        ///     <bullet_item>Kilometer—The linear unit will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Decimeter—The linear unit will be decimeters.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>垂直 z 值的线性单位。</para>
        ///   <para>它由垂直坐标系定义（如果存在）。如果垂直坐标系不存在，则应从单位列表中定义 z 单位，以确保测地线计算正确。默认值为 meter。</para>
        ///   <bulletList>
        ///     <bullet_item>英寸—线性单位将为英寸。</bullet_item><para/>
        ///     <bullet_item>英尺—线性单位为英尺。</bullet_item><para/>
        ///     <bullet_item>码—线性单位将为码。</bullet_item><para/>
        ///     <bullet_item>Mile US—线性单位将为英里。</bullet_item><para/>
        ///     <bullet_item>海里—线性单位为海里。</bullet_item><para/>
        ///     <bullet_item>毫米—线性单位将为毫米。</bullet_item><para/>
        ///     <bullet_item>厘米—线性单位将为厘米。</bullet_item><para/>
        ///     <bullet_item>米—线性单位将为米。</bullet_item><para/>
        ///     <bullet_item>公里—线性单位将为千米。</bullet_item><para/>
        ///     <bullet_item>分米—线性单位为分米。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z unit")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _z_unit_value _z_unit { get; set; } = _z_unit_value._METER;

        public enum _z_unit_value
        {
            /// <summary>
            /// <para>Inch</para>
            /// <para>Inch—The linear unit will be inches.</para>
            /// <para>英寸—线性单位将为英寸。</para>
            /// </summary>
            [Description("Inch")]
            [GPEnumValue("INCH")]
            _INCH,

            /// <summary>
            /// <para>Foot</para>
            /// <para>Foot—The linear unit will be feet.</para>
            /// <para>英尺—线性单位为英尺。</para>
            /// </summary>
            [Description("Foot")]
            [GPEnumValue("FOOT")]
            _FOOT,

            /// <summary>
            /// <para>Yard</para>
            /// <para>Yard—The linear unit will be yards.</para>
            /// <para>码—线性单位将为码。</para>
            /// </summary>
            [Description("Yard")]
            [GPEnumValue("YARD")]
            _YARD,

            /// <summary>
            /// <para>Mile US</para>
            /// <para>Mile US—The linear unit will be miles.</para>
            /// <para>Mile US—线性单位将为英里。</para>
            /// </summary>
            [Description("Mile US")]
            [GPEnumValue("MILE_US")]
            _MILE_US,

            /// <summary>
            /// <para>Nautical mile</para>
            /// <para>Nautical mile—The linear unit will be nautical miles.</para>
            /// <para>海里—线性单位为海里。</para>
            /// </summary>
            [Description("Nautical mile")]
            [GPEnumValue("NAUTICAL_MILE")]
            _NAUTICAL_MILE,

            /// <summary>
            /// <para>Millimeter</para>
            /// <para>Millimeter—The linear unit will be millimeters.</para>
            /// <para>毫米—线性单位将为毫米。</para>
            /// </summary>
            [Description("Millimeter")]
            [GPEnumValue("MILLIMETER")]
            _MILLIMETER,

            /// <summary>
            /// <para>Centimeter</para>
            /// <para>Centimeter—The linear unit will be centimeters.</para>
            /// <para>厘米—线性单位将为厘米。</para>
            /// </summary>
            [Description("Centimeter")]
            [GPEnumValue("CENTIMETER")]
            _CENTIMETER,

            /// <summary>
            /// <para>Meter</para>
            /// <para>Meter—The linear unit will be meters.</para>
            /// <para>米—线性单位将为米。</para>
            /// </summary>
            [Description("Meter")]
            [GPEnumValue("METER")]
            _METER,

            /// <summary>
            /// <para>Kilometer</para>
            /// <para>Kilometer—The linear unit will be kilometers.</para>
            /// <para>公里—线性单位将为千米。</para>
            /// </summary>
            [Description("Kilometer")]
            [GPEnumValue("KILOMETER")]
            _KILOMETER,

            /// <summary>
            /// <para>Decimeter</para>
            /// <para>Decimeter—The linear unit will be decimeters.</para>
            /// <para>分米—线性单位为分米。</para>
            /// </summary>
            [Description("Decimeter")]
            [GPEnumValue("DECIMETER")]
            _DECIMETER,

        }

        /// <summary>
        /// <para>Project geodesic azimuths</para>
        /// <para><xdoc>
        ///   <para>Specifies whether geodesic azimuths will be projected to correct the angle distortion caused by the output spatial reference.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—Geodesic azimuths will not be projected. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Geodesic azimuths will be projected.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否投影测地线方位角以校正由输出空间参考引起的角度失真。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中—不会投影测地线方位角。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中—将投影测地线方位角。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Project geodesic azimuths")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _project_geodesic_azimuths_value _project_geodesic_azimuths { get; set; } = _project_geodesic_azimuths_value._false;

        public enum _project_geodesic_azimuths_value
        {
            /// <summary>
            /// <para>GEODESIC_AZIMUTHS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("GEODESIC_AZIMUTHS")]
            [GPEnumValue("false")]
            _false,

            /// <summary>
            /// <para>PROJECT_GEODESIC_AZIMUTHS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("PROJECT_GEODESIC_AZIMUTHS")]
            [GPEnumValue("true")]
            _true,

        }

        public Aspect SetEnv(int? autoCommit = null, object cellSize = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object mask = null, object outputCoordinateSystem = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(autoCommit: autoCommit, cellSize: cellSize, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, mask: mask, outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}